<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
	<meta charset="UTF-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title>&#x8D85;&#x70AB;WebGL&#x80CC;&#x666F;&#x6EDA;&#x52A8;&#x6548;&#x679C; - &#x7AD9;&#x957F;&#x7D20;&#x6750;</title>

	<link href="https://fonts.googleapis.com/css?family=Roboto+Mono:400,700" rel="stylesheet">
	<link rel="stylesheet" type="text/css" href="css/normalize.css" />
	<link rel="stylesheet" type="text/css" href="css/demo.css" />
	<script>document.documentElement.className = 'js';</script>
</head>
<body class="demo-3 loading">
	<canvas id="webgl"></canvas>
	<svg class="hidden">
		<symbol id="icon-arrow" viewBox="0 0 24 24">
			<title>arrow</title>
			<polygon points="6.3,12.8 20.9,12.8 20.9,11.2 6.3,11.2 10.2,7.2 9,6 3.1,12 9,18 10.2,16.8 " />
		</symbol>
		<symbol id="icon-drop" viewBox="0 0 24 24">
			<title>drop</title>
			<path d="M12,21c-3.6,0-6.6-3-6.6-6.6C5.4,11,10.8,4,11.4,3.2C11.6,3.1,11.8,3,12,3s0.4,0.1,0.6,0.3c0.6,0.8,6.1,7.8,6.1,11.2C18.6,18.1,15.6,21,12,21zM12,4.8c-1.8,2.4-5.2,7.4-5.2,9.6c0,2.9,2.3,5.2,5.2,5.2s5.2-2.3,5.2-5.2C17.2,12.2,13.8,7.3,12,4.8z" />
			<path d="M12,18.2c-0.4,0-0.7-0.3-0.7-0.7s0.3-0.7,0.7-0.7c1.3,0,2.4-1.1,2.4-2.4c0-0.4,0.3-0.7,0.7-0.7c0.4,0,0.7,0.3,0.7,0.7C15.8,16.5,14.1,18.2,12,18.2z" />
		</symbol>
	</svg>
	<main>
		<header class="content content--header">
			<div class="content__top">
				<h1 class="main-title">Scroll Spirals</h1>
				<p class="main-tagline">Decorative Background Effects with WebGL</p>

				<nav class="demos">
					<a class="demo" href="index.html">Demo 1</a>
					<a class="demo" href="index2.html">Demo 2</a>
					<a class="demo demo--current" href="index3.html">Demo 3</a>
					<a class="demo" href="index4.html">Demo 4</a>
					<a class="demo" href="index5.html">Demo 5</a>
					<a class="demo" href="index6.html">Demo 6</a>
					<a class="demo" href="index7.html">Demo 7</a>
					<a class="demo" href="index8.html">Demo 8</a>
					<a class="demo" href="index9.html">Demo 9</a>
				</nav>
			</div>
		</header>
		
		<section class="content content--main"></section>

	</main>
	<script src="js/regl.min.js"></script>
	<script type="x-shader/x-fragment" id="fragmentShader">
	#define TWO_PI 6.2831853072
	#define PI 3.14159265359

	precision highp float;

	uniform float globaltime;
	uniform vec2 resolution;
	uniform float aspect;
	uniform float scroll;
	uniform float velocity;
	uniform sampler2D texture;

	const float timescale = 0.1;
	const float twist = 2.0;

	vec2 rotate(vec2 v, float angle) {
		float c = cos(angle);
		float s = sin(angle);
		return v * mat2(c, -s, s, c);
	}

	float nsin(float value) {
		return sin(value * TWO_PI) * 0.5 + 0.5;
	}

	void main(void) {
		float time = globaltime * timescale;
		vec2 center = vec2(sin(TWO_PI * time * 0.2), cos(TWO_PI * time * 0.2)) * nsin(time * 0.3) * 0.5;
		vec2 tx = (gl_FragCoord.xy / resolution.xy - 0.5 - center) * vec2(aspect, 1.0);
		float len = 1.0 - length(tx);
		float zoom = 0.0 + scroll - len * 2.0 * (1.0 - scroll) + len * velocity;

		vec4 imgColor = texture2D(
			texture,
			rotate(
				(tx + center) * vec2(1.0, -1.0) * zoom,
				twist * TWO_PI * nsin(len + time) * scroll + time
			) + 0.5
		);

		gl_FragColor = imgColor;
	}
	</script>
	<script src="js/demo3.js"></script>
</body>
</html>
